/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.plan.manager;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.plan.dto.AfpDetaDto;
import com.brain.plan.dto.AfpDto;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Service
public class AfpDetaManager extends ComunManager<AfpDetaDto> implements Serializable {
    
    /**
     * Logger permite registrar los errores que ocurren
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(AfpDetaManager.class);
    
    /**
     * idEntidad utilizado para construir los títulos de los paneles de la entidad
     * @since 09/01/2014
     */
    private Long idEntidad = 281L;
    
    /**
     * applicationMBean permite obtener diferentes valores de la aplicación, como acciones y estilos
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    
    /**
     * springHibernateDao usado para realizar las operaciones de listar, guardar, eliminar
     * @since 09/01/2014
     */
    @Resource
    private DAOGenerico<AfpDetaDto> springHibernateDao;
    
    /**
     * recursosManager permite mostrar mensajes en las vistas
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;

    /**
     * Metodo que lista todos los dto (AfpDetaDto)
     * @since 09/01/2014
     * @throws DAOException 
     * @return Lista de dto (AfpDetaDto)
     */
    public List<AfpDetaDto> obtenerTodos() throws DAOException {
        return springHibernateDao.listarTodosDtos(AfpDetaDto.class);
    }

    /**
     * Metodo que lista todos los dto (AfpDetaDto) usando filtros
     * @since 09/01/2014
     * @param filtros es el filtro utilizado en la búsqueda
     * @throws DAOException 
     * @return Lista de dto (AfpDetaDto)
     */
    public List<AfpDetaDto> obtenerConFiltro(Map<String, Object> filtros) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltros(AfpDetaDto.class, filtros);
    }

    /**
     * Metodo que lista todos los dto (AfpDetaDto) usando filtros y un orden
     * @since 09/01/2014
     * @param filtros es el filtro utilizado en la búsqueda
     * @param orden orden usado en la búsqueda
     * @throws DAOException 
     * @return Lista de dto (AfpDetaDto)
     */
    public List<AfpDetaDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(AfpDetaDto.class, filtros, orden);
    }

    /**
     * Metodo que permite obtener la entidad AfpDetaDto usado el id como filtro
     * @since 09/01/2014
     * @param id usado para realizar la búsqueda de la entidad
     * @throws DAOException
     * @return entidad AfpDetaDto
     */
    public AfpDetaDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(AfpDetaDto.class, id);
    }
    
    /**
     * obtenerPorcentajesPorAnioMes(): obtiene los porcentajes (entidad AfpDetaDto) según el año, mes y entidad AfpDto ingresado
     * @since 10/01/2014
     * @param anio
     * @param mes
     * @param afpDto
     * @return retorna la entidad AfpDetaDto
     * @throws DAOException 
     */
     public AfpDetaDto obtenerPorcentajesPorAnioMes(Integer anio, String mes, AfpDto afpDto) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        AfpDetaDto obj = null;
        String query = "select e from AfpDetaDto as e";
        query += " where e.afpDto.id = ?";
        listaParametros.add(afpDto.getId());
        query += " and e.anio = ?";
        listaParametros.add(anio);
        query += " and e.mes = '"+ mes +"'";
        List<AfpDetaDto> lst = springHibernateDao.ejecutarQueryGeneric(query, listaParametros);
        if(lst != null && !lst.isEmpty()){
            obj = lst.get(0);
        }
        return obj;
    }
    
     /**
     * Metodo que permite inicializar la entidad AfpDetaDto
     * @since 09/01/2014
     * @return entidad AfpDetaDto
     */
    public AfpDetaDto inicializar() {
        
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        AfpDetaDto dto = new AfpDetaDto();
        dto.setAnio(UtilCore.Fecha.obtenerAnioActual());
        dto.setMes("ENERO");
        dto.setComisionFlujo(BigDecimal.ZERO);
        dto.setComisionSaldo(BigDecimal.ZERO);
        dto.setComisionMixta(BigDecimal.ZERO);
        dto.setPorcentajeFondo(BigDecimal.ZERO);
        dto.setPorcentajeSeguro(BigDecimal.ZERO);
        dto.setFactorMora(BigDecimal.ZERO);
        dto.setFechaPago(UtilCore.Fecha.obtenerFechaActualDate());
        
        return dto;
    }
    
    /**
     * Metodo que permite guardar la entidad AfpDetaDto
     * @since 09/01/2014
     * @param dto entidad a guardar
     * @return retorna una cadena, que indica la página a mostrarse después de guardar la entidad
     */
    public String guardar(AfpDetaDto dto) {
        String ir = "";
        String mensajeTrx = ""; 
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        if (sessionMBean.getAccionDetalle() == applicationMBean.getNuevo()) {
            try {
                UtilCore.General.toUpperCaseDto(dto);
                nuevo(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                ir = "";
            } catch (Exception ex) {
                logger.error(ex.getMessage());
                recursosManager.showError(ex.getMessage());
                ir = null;
            }
        }
        else if (sessionMBean.getAccionDetalle() == applicationMBean.getEditar()) {
            try {
                UtilCore.General.toUpperCaseDto(dto);
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                ir = "";
            } catch (Exception ex) {
                logger.error(ex.getMessage());
                recursosManager.showError(ex.getMessage());
                ir = null;
            }
        }
        
        return ir;
    }
    
    /**
     * listaAnios(): forma un combo con años, comenzando en el año actual
     * @since 10/01/2014
     * @return retorna un combo de años
     */
    public SelectItem[] listaAnios() {
        SelectItem[] si = new SelectItem[60];
        int j = UtilCore.Fecha.obtenerAnioActual();
        for (int i=0; i<=50; i++) {
            si[i] = new SelectItem(Integer.valueOf(j).toString(), Integer.valueOf(j).toString());
            j++;
        }
        return si;
    }
    
    /**
     * listaMeses(): forma un combo de meses en letras
     * @since 10/01/2014
     * @return retorna un combo de meses
     */
    public SelectItem[] listaMeses() {
        SelectItem[] si = new SelectItem[12];
        for (int i=11; i>=0; i--) {
            si[i] = new SelectItem(obtenerMesTexto(i), obtenerMesTexto(i));
        }
        return si;
    }
    
    /**
     * obtenerMesTexto(): convierte un mes (formato número) a formato texto
     * @param mes
     * @return retorna el mes en formato texto
     */
    public String obtenerMesTexto(int mes) {
        String[] meses = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre")            
        };
        return meses[mes];
    }
    
    /**
     * obtenerNumeroMes(): dado un mes en formato texto, se obtiene su representación numérica
     * @since 10/01/2014
     * @param mes
     * @return devuelve el número que corresponde al mes
     */
    public int obtenerNumeroMes(String mes) {        
        int i = 0;
        while (!mes.equals(obtenerMesTexto(i))) {
            i++;
        }
        return i;
    }
    
    /**
     * getUltimoAfpDeta(): retorna el último registro de la entidad AfpDetaDto registrado en el sistema
     * @since 10/01/2014
     * @param afpDto
     * @return retorna la entidad AfpDetaDto
     */
    public AfpDetaDto getUltimoAfpDeta(AfpDto afpDto) {
        AfpDetaDto afpDetaDto = null;
        Long id = 0L;
        for (AfpDetaDto x: afpDto.getListaDeta()) {
            if (x.getId().compareTo(id) > 0) {
                id = x.getId();
                afpDetaDto = x;
            }
        }
        
        return afpDetaDto;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        AfpDetaManager.logger = logger;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public DAOGenerico<AfpDetaDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<AfpDetaDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }
}